﻿using PcaCaja.BOL;
using PcaCore.BOL.Pca;
using PcaCore.DAL.Log;
using PcaCore.DAL.Pca;
using PcaParqueos.BOL;
using PcaParqueos.DAL;
using PcaSocios.BOL;
using PcaSocios.DAL;
using PcaVentas.BOL;
using PcaVentas.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace PcaWeb.Areas.Parqueos.Models
{
    public class TicketAbonado
    {
        private List<string> Lineas;
        private oVwComprobante comprobante;
        private oVwPagoComprobante pago;
        private oVwMovimiento movimiento;
        private string usuario;
        private string fechaHoraImprecion;
        private oEmpresa empresa;
        private oOficina oficina;
        private oUsuarioTerminal usuarioTerminal;
        private oCorrelativo correlativo;
        private oVwCliente cliente;

        //Varibles de ESC/POS
        private string inicializar = "\x1b\x40";
        private string letraNegrita = "\x1b\x21\x09";
        private string letraNormal = "\x1b\x21\x00";
        private string centrar = "\x1b\x61\x01";
        private string izquierda = "\x1b\x61\x00";
        private string feed = "\x0a";
        private string cortar = "\x1d\x56\x42\x00";

        public TicketAbonado(long comprobanteId)
        {
            usuarioTerminal = dUsuarioTerminal.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), dSesion.GetUsuarioId());

            if (usuarioTerminal == null)
                throw new Exception("No existe un terminal asignado al usuario");
 
            empresa = dEmpresa.Get(dSesion.GetEmpresaId());
            oficina = dOficina.Get(dSesion.GetOficinaId(), dSesion.GetOficinaId());

            comprobante = dComprobante.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), comprobanteId);

            if (comprobante == null)
                throw new Exception("Error al consultar informacion del comprobante");

            cliente = dCliente.Get(dSesion.GetEmpresaId(), comprobante.cliente_id);

            List<oVwPagoComprobante> pagos = dPagoComprobante.GetList(comprobante.empresa_id, comprobante.oficina_id, comprobante.comprobante_id);
            correlativo = dCorrelativo.Get(comprobante.empresa_id, comprobante.oficina_id, usuarioTerminal.terminal_id, comprobante.tipo_comprobante_id);

            if (correlativo == null)
                throw new Exception("No se encontro informacion de la impresora en la tabla correlativos"); 

            if (pagos.Count == 0)
                throw new Exception("No existe pagos para el comprobante");

            if (pagos.Count > 1)
                throw new Exception("Existen mas de un pago asignado al comprobante, no se puede continuar");

            pago = pagos[0];

            movimiento = PcaCaja.DAL.dMovimiento.Get(pago.empresa_id, pago.oficina_id, pago.movimiento_id);

            usuario = Membership.GetUser().UserName;
            fechaHoraImprecion = string.Format("{0}", DateTime.Now.ToString("dd/MM/yyyy          hh:mm tt"));
            Procesar();
        }
        private string CompletarEspaciosBlanco(string text, int size = 11)
        {
            string resul = "           " + text;
            return resul.Substring(resul.Length - size);
        }

        private void Procesar()
        {
            Lineas = new List<string>();
            Lineas.Add(inicializar);
            Lineas.Add(centrar);
            Lineas.Add(letraNegrita);
            Lineas.Add(empresa.nombre_comercial + "\r\n");
            Lineas.Add(feed);
            Lineas.Add(letraNormal);
            Lineas.Add(empresa.nombre + "\r\n");
            Lineas.Add(oficina.direccion + "\r\n");
            Lineas.Add(String.Format("RUC: {0}\r\n", empresa.codigo));
            Lineas.Add(String.Format("Ticket #: {0}\r\n", comprobante.strserienumero));
            Lineas.Add(String.Format("Serie Impresora #: {0}\r\n", comprobante.adicional1));
            Lineas.Add(izquierda);
            Lineas.Add(feed);
            if (cliente != null)
            {
                Lineas.Add(String.Format("Cliente :{0}\r\n", cliente.nombre));
                Lineas.Add(feed);
            }
            Lineas.Add(String.Format("{0}\r\n", movimiento.detalle));
            Lineas.Add(feed);
            Lineas.Add(String.Format("A Pagar  : {0} {1}\r\n", comprobante.siglas_moneda, CompletarEspaciosBlanco(comprobante.precio_venta.ToString("##,###.00"))));
            Lineas.Add(String.Format("Efectivo : {0} {1}\r\n", comprobante.siglas_moneda, CompletarEspaciosBlanco(pago.efectivo_percibido.ToString("##,###.00"))));
            Lineas.Add(String.Format("Vuelto   : {0} {1}\r\n", comprobante.siglas_moneda, CompletarEspaciosBlanco((pago.efectivo_percibido - comprobante.precio_venta).ToString("##,###.00"))));
            Lineas.Add(feed);
            Lineas.Add(usuario + "\r\n");
            Lineas.Add(fechaHoraImprecion);
            Lineas.Add(feed);
            Lineas.Add(cortar);
        }

        public List<string> GetLinesPrint
        {
            get { return Lineas; }
        }

        public string GetPrinterProxy
        {
            get { return correlativo.url_proxy_impresora; }
        }

        public string GetPrinterPort
        {
            get { return correlativo.puerto_impresora; }
        }
    }
}